﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;

namespace CsharpTrainer.Linq
{
    public interface IRepository<T>
    {
        /// <summary>
        /// 返回满足条件的一条数据
        /// </summary>
        T Get(Expression<Func<T, bool>> predicate);
        /// <summary>
        /// 返回指定满足条件的一条数据
        /// </summary>
        TEntity Get<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class;
        /// <summary>
        /// 通过Id返回一条数据
        /// </summary>
        T GetById(object id);
        /// <summary>
        /// 通过Id返回指定的一条数据
        /// </summary>
        TEntity GetById<TEntity>(object id) where TEntity : class;
        /// <summary>
        /// 获取所有数据（延迟加载）
        /// </summary>
        IQueryable<T> GetAll();
        /// <summary>
        /// 获取指定表的所有数据（延迟加载）
        /// </summary>
        IQueryable<TEntity> GetAll<TEntity>() where TEntity : class;
        /// <summary>
        /// 返回只满足条件的所有数据（延迟加载）
        /// </summary>
        IEnumerable<T> GetAll(Func<T, bool> exp);
        /// <summary>
        /// 是否存在满足条件的数据
        /// </summary>
        bool IsExists(Expression<Func<T, bool>> predicate);
        /// <summary>
        /// 添加一条数据
        /// </summary>
        void Add(T entity);
        /// <summary>
        /// 添加指定的表到数据库
        /// </summary>
        void Add<TEntity>(TEntity entity) where TEntity : class;
        /// <summary>
        /// 批量添加数据
        /// </summary>
        void AddBatch(List<T> entitys);
        /// <summary>
        /// 批量添加指定的表数据
        /// </summary>
        void AddBatch<TEntity>(List<TEntity> entitys) where TEntity : class;
        //void Delete(T entity);
        void Delete(object id);
        void DeleteBy<TEntity>(TEntity entity) where TEntity : class;
        void DeleteBatch(IQueryable<T> predicate);
        void DeleteBatch<TEntity>(IQueryable<TEntity> predicate) where TEntity : class;
        /// <summary>
        ///  批量更新
        /// </summary>
        /// <param name="predicate"></param>
        /// <param name="updater"></param>
        void UpdateBatch(IQueryable<T> predicate, Expression<Func<T, T>> updater);
        void UpdateBatch<TEntity>(IQueryable<TEntity> predicate, Expression<Func<TEntity, TEntity>> updater) where TEntity : class;
        /// <summary>
        /// 计算要插入、更新或删除的已修改对象的集，并执行相应命令以实现对数据库的更改。
        /// </summary>
        void SubmitChanges();
        /// <summary>
        /// 执行增删改
        /// </summary>
        /// <param name="command">Sql语句</param>
        /// <param name="args">参数</param>
        /// <returns></returns>
        int ExcuteCommand(string command, params object[] args);
        /// <summary>
        /// 获取数据库时间
        /// </summary>
        /// <returns></returns>
        DateTime GetSysDate();
        /// <summary>
        /// 使用Sql语句查询默认类型
        /// </summary>
        IEnumerable<T> ExecuteQuery(string command, params object[] args);
        /// <summary>
        /// 使用Sql语句查询指定的表
        /// </summary>
        IEnumerable<TEntity> ExecuteQuery<TEntity>(string command, params Object[] args);
    }
}